import pymysql
from itemadapter import ItemAdapter
import logging

class CucNewsPipeline:
    """处理简单的处理逻辑，例如清洗数据或日志记录"""
    def process_item(self, item, spider):
        # 去除所有字段的前后空格
        adapter = ItemAdapter(item)
        for field in ['title', 'publisher', 'view_info', 'update_date']:
            if adapter.get(field):
                adapter[field] = adapter[field].strip()
        return item

class MySQLPipeline:
    """将爬取的数据存入 MySQL 数据库"""
    def open_spider(self, spider):
        """爬虫启动时连接数据库"""
        try:
            self.conn = pymysql.connect(
                host='localhost',  # 数据库地址
                user='root',  # 数据库用户名
                password='123456',  # 数据库密码
                database='scrapy_db',  # 数据库名称
                charset='utf8mb4'  # 编码
            )
            self.cursor = self.conn.cursor()
            spider.logger.info("MySQL数据库连接成功！")
        except pymysql.MySQLError as e:
            spider.logger.error(f"MySQL数据库连接失败: {e}")
            raise
    def close_spider(self, spider):
        """爬虫结束时关闭数据库连接"""
        try:
            self.conn.commit()  # 提交所有事务
            self.conn.close()
            spider.logger.info("MySQL数据库连接已关闭！")
        except pymysql.MySQLError as e:
            spider.logger.error(f"MySQL数据库关闭失败: {e}")
            raise

    def process_item(self, item, spider):
        """将数据插入 MySQL 数据库"""
        adapter = ItemAdapter(item)

        sql = """
            INSERT INTO cuc_news (title, publisher, view_info, update_date)
            VALUES (%s, %s, %s, %s)
        """
        values = (
            adapter.get('title', '未找到标题'),
            adapter.get('publisher', '未找到发布者'),
            adapter.get('view_info', '未找到阅读信息'),
            adapter.get('update_date', '未找到日期'),
        )
        # 插入数据
        self._execute_sql(sql, values, spider)
        return item
    def _execute_sql(self, sql, values, spider):
        """执行SQL插入操作，并处理错误"""
        try:
            self.cursor.execute(sql, values)
            spider.logger.info(f"成功插入数据: {values[0]} 到 MySQL")
        except pymysql.MySQLError as e:
            spider.logger.error(f"插入数据失败: {e} - 数据: {values}")
            self.conn.rollback()  # 回滚事务
